/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef REGDATA_H
#define REGDATA_H



#include "GeneralDefine.h"

#include "md5check.h"

#include <QVector>
#include <QString>
#include <QFile>
#include <QDataStream>
#include <QDebug>

#define     ROBOT_FLODER  "robotData"
//#define     REG_FLODER  "/dat/"
#define     PR_REG_FILE "/dat/pr_register.dat"
#define     R_REG_FILE  "/dat/r_register.dat"
#define     PL_REG_FILE "/dat/pl_register.dat"
#define     TIMER_REG_FILE "/dat/timer_register.dat"

#define     D_ROBOT_REG_SIZE    1000
#define     D_ROBOT_TIMER_REG_SIZE 200

//#define D_USE_MD5_CHECK
/**
 * @brief The RegData class 寄存器数据类
 */
class RegData
{

public:
    RegData();


public:

    int clearCurrentProduction();
    int clearAccumulatedProduction();
    int getProduction(float &thisTimeProduction, float &accumulateProduction);
    int getWorkPieceRatio(float& workpieceRatio);

    /**
     * @brief Init      初始化数据
     */
    int Init(int startType);


    /**
     * @brief readRegRValue   读R寄存器的值，暴露operationCall操作
     * @return
     */
    int readRegRValue_fromFile();
    /**
     * @brief readRegPrValue    读pr寄存器的值，暴露operationCall操作
     * @return
     */
    int readRegPrValue_fromFile();
    /**
     * @brief readRegPlValue     读pl寄存器的值，暴露operationCall操作
     * @return
     */
    int readRegPlValue_fromFile();
    /**
     * @brief readRegTimerValue
     */
    int readRegTimerValue_fromFile();
    /**
     * @brief saveRegRValue     保存R寄存器的值，暴露operationCall操作
     * @param tmpRValue         寄存器R数据
     */
    int setRegRValue(QVector<double> tmpRValue);
    /**
     * @brief setRRegValue      设置ｒ寄存器的值
     * @param number            号码
     * @param rValue            ｒ寄存器的值
     */
    int setRRegValue(int number,double rValue);//index  从０开始
    int getRRegValue(int number,double &rValueOut);//index  从０开始
    /**
     * @brief saveRegPrValue    保存pr寄存器的值，暴露operationCall操作
     * @param tmpPrValue        寄存器pr数据
     */
//    void saveRegPrValue(QVector <PrRegStruct> tmpPrValue);
    int setRegPrValue(QVector <PointPro> tmpPrValue);
    /**
     * @brief saveRegPlValue    保存pl寄存器的值，暴露operationCall操作
     * @param tmpPlValue        寄存器pl数据
     */
    int setRegPlValue(QVector <PlRegStruct> tmpPlValue);
    /**
     * @brief saveRegTimerValue
     * @param tmpTimerValue
     */
    int setRegTimerValue(QVector <double> tmpTimerValue);
    /**
     * @brief writeRegR2File    将Ｒ寄存器的数据写到文件
     */
    void writeRegR2File_stream();
    int writeRegR2File_json();
    /**
     * @brief writeRegPr2File   将ｐｒ寄存器的数据写到文件
     */
    void writeRegPr2File_stream();
    int writeRegPr2File_json();
    /**
     * @brief writeRegPl2File   将ｐｌ寄存器的数据写到文件
     */
    void writeRegPl2File_stream();
    int writeRegPl2File_json();
    /**
     * @brief writeRegTimer2File
     */
    void writeRegTimer2File_stream();
    int writeRegTimer2File_json();
    /**
     * @brief writeAllRegFile   将寄存器的数据写到文件
     */
    void writeAllReg_toFile();
    /**
     * @brief clearPlReg        清空ｐｌ寄存器
     */
    int clearPlReg(int plNum);
    int getPlRegister(int plNum,PlRegStruct &valueOut);
    /**
     * @brief clearTimerReg
     * @param timerNum
     */
    int clearTimerReg(int timerNum);
    /**
     * @brief setPlRegValue     设置ｒｅｇ的值
     * @param plNum             ｐｌ号码
     * @param plReg             数据
     */
    int setPlRegValue(int plNum,PlRegStruct plReg);
    /**
     * @brief setTimerRegValue
     * @param timerNum
     * @param timerReg
     */
    int setTimerRegValue(int timerNum,double timerReg);
    /**
     * @brief clearAllTimerValue
     */
    void clearAllTimerValue();
    /**
     * @brief clearAllPlValue   清除所有ｐｌ寄存器数值
     */
    void clearAllPlValue();
    void clearAllPrValue();
    void clearAllRegRValue();


    /**
     * @brief setPrRegValue     设置ｐｒ寄存器的值
     * @param number            号码
     * @param pointPro          点位数据
     */
    int setPrRegValue(int number,PointPro pointPro);
    int setPrRegValueType(int number, bool isCoordinatePoint);
    int getPrValue(int index,PointPro &pointPro);
    int getPrValue_ij(int index_i,int index_j,double &valueOut);
    /*************
      *日期：2017－1－21
      * 修改人：ｓｔｅｖｅｎ
      * 修改内容：添加设置ｐｒ[i,j]接口
      * **********/
    /**
     * @brief setPrIJValue          设置Ｐｒ[i,j]
     * @param num_i
     * @param num_j
     * @param position
     */
    int setPrIJValue(int num_i,int num_j,double position);


    QVector<double> returnRValue(bool &initialStatus);
    QVector <PointPro> returnPrValue(bool &initialStatus);
    QVector <PlRegStruct> returnPlValue(bool &initialStatus);
    QVector <double> returnTimerValue(bool &initialStatus);


    /******************
     * 日期：2017－1－21
     * 修改人：ｓｔｅｖｅｎ
     * 修改内容：添加获取ｍｓｇ的接口，主要用于线程数据保护
     * ****************/

    int readVersion(std::vector <ComponentVersion> &componentVersionList);
    /**
     * @brief updateControllerInfoLevel3
     * @param updateDataLv3
     * @return
     */
    int updateControllerInfoLevel3(UpdateDataLv3 &updateDataLv3);
    /**
     * @brief setRegTimer
     * @param timerNum                  时间寄存器号码
     * @param changeStatus             时间寄存器命令状态
     * @param countTimer                寄存器时间
     * @return
     */
    int setRegTimer(int timerNum,int changeStatus,double countTimer);

    int updateTimerRegisterValue_index(int timerNum);

private:
    /**
     * @brief readRegRFile  读取Ｒ寄存器的值
     * @param fileName      文件名称
     */
    int readRegRFile_stream(QString fileName);
    int readRegRFile_json(QString fileName);
    /**
     * @brief readRegPrFile 读取ｐｒ寄存器的值
     * @param fileName      文件名称
     */
    int readRegPrFile_stream(QString fileName);
    int readRegPrFile_json(QString fileName);
    /**
     * @brief readRegPlFile  读取ｐｌ寄存器的值
     * @param fileName       文件名称
     */
    int readRegPlFile_stream(QString fileName);
    int readRegPlFile_json(QString fileName);
    /**
     * @brief readRegTimerFile
     * @param fileName
     */
    int readRegTimerFile_stream(QString fileName);
    int readRegTimerFile_json(QString fileName);


    int getPointProFromJson(const QJsonObject &obj_item_point, PointPro &pointOut);
    int transPointToJson(const PointPro &pointIn, QJsonObject &obj_out);

    /**
   * @brief lock
   */
    bool lock(){
            pthread_mutex_lock(&regThreadLock) ;
            return true;
    }

    /**
   * @brief unlock
   */
    void unlock(){
        pthread_mutex_unlock(&regThreadLock) ;
    }

    /**
   * @brief trylock
   */
    bool trylock(){
        if( 0==pthread_mutex_trylock(&regThreadLock) )
        {
            return true;
        }else{
            return false;
        }
    }

    int updateTimerRegisterValue();

    int addMsg(int messageLevel,
                std::string componentName,
                std::string messageType,
                int messageCode,
                int robotIdIn,
                int parameter1 = 0,
                int parameter2 = 0,
                int parameter3 = 0,
                int parameter4 = 0);


public:
    /**
     * @brief robotId   机器人Ｉｄ
     */
    int robotId;
    /**
     * @brief robotName     机器人名称
     */
    QString robotName;

public:
    QVector <double> regRValue;
    /**
     * @brief regPrValue        pr寄存器的值，属性property暴露
     */
//    QVector <PrRegStruct> regPrValue;
    QVector <PointPro> regPrValue;
    /**
     * @brief regPlValue        pl寄存器的值，属性property暴露
     */
    QVector <PlRegStruct> regPlValue;
    /**
     * @brief regTimerValue 需要调用函数更新updateTimerRegisterValue_index
     */
    QVector <double> regTimerValue;

private:


    struct timeval timeValStartTime,timeValEndTime;

    /**
     * @brief timerCount             时间
     */
    QVector <double> timerCount;
    /**
     * @brief startTime             起始时间
     */
    QVector <timeval> startTime;
    /**
     * @brief endTime               终止时间
     */
    QVector <timeval> endTime;
    /**
     * @brief timerProcessType                  时间处理方式
     */
    QVector <TIMER_REG_PROCESS_TYPE> timerProcessType;

    /******************
      *日期：2017－1－21
      * 修改人：ｓｔｅｖｅｎ
      * 修改内容：添加互斥锁，保证线程数据安全
      * ****************/

    /**
   * @brief regThreadLock ///线程锁
   */
      pthread_mutex_t regThreadLock;

    /**
   * @brief attr ///线程锁参数
   */
      pthread_mutexattr_t regAttr;

     ComponentVersion versionInfo;

     bool regRInitialOk;
     bool regTimerInitialOk;
     bool regPrInitialOk;
     bool regPlInitialOk;

     float thisTimeProduction_old;
     float accumulatedProduction_old;
     float regTimerValue_old;
     double workpieceRatio_old;




};

#endif // REGDATA_H
